﻿#pragma once

#include "avatar_id.h"
#include <DirectXMath.h>
#include <EASTL/vector.h>
#include <static_string.h>

struct aiNode;

namespace ifire::game {

// Avatar的Node，保存原始的数据，并且保存与AvatarID的对应信息
struct AvatarNode {
  // 节点的名称
  ikit::sstr name;
  // 节点所对应的AvatarID
  AvatarID avatar_id;
  // 从文件中读取的变换矩阵，是原始的Pose矩阵，通过这个分解出每个关节的相对变换。
  DirectX::XMFLOAT4X4 transform_matrix;
  // 针对父关节的相对变换（位移）
  DirectX::XMFLOAT3 position;
  // 针对父关节的相对变换（旋转）
  DirectX::XMFLOAT4 rotation;

  // 这个是用于印射的时候，哪个骨骼被绑到上面的索引。其实这有点蠢，但暂时这么用着。
  int index_id;

  // 此节点的父节点
  AvatarNode* parent;
  // 此节点的子节点
  eastl::vector<AvatarNode*> children;

  AvatarNode(AvatarNode* _parent, int child_count, ikit::sstr _name,
      const DirectX::XMFLOAT4X4& trans_mat, const DirectX::XMFLOAT3& position,
      const DirectX::XMFLOAT4& rotation);
  ~AvatarNode();

  // 用于从aiNode中创建一个Node
  static AvatarNode* CreateFrom(AvatarNode* parent_node, const aiNode* node,
      const DirectX::XMFLOAT4X4& parent);
};
} // namespace ifire::game